package fag.core.game;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;

import javax.swing.JPanel;

import fag.core.geometry.Rectangle2D;

public class Camera extends JPanel {

	private static final long serialVersionUID = -1453636238210181598L;
	Scene scene = null;
	
	// TODO : Gestion de la transformation de la caméra
	private AffineTransform transformation = new AffineTransform();
	
	/**
	 * Constructeur par défault.
	 */
	public Camera() {
		setDoubleBuffered(true);
	}
	
	/**
	 * Affichage du HUD.
	 * Point d'extention du framework.
	 * @param graphics2d Le contexte de dessin.
	 */
	public void drawHud(Graphics2D graphics2d) {
	}
	
	/**
	 * Affichage des objets de la scène.
	 * @param graphics Le contexte graphique.
	 */
	public final void paintComponent(Graphics graphics) {

		Graphics2D graphics2d =(Graphics2D)graphics;
		graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		graphics2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		graphics2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
		
		// Redessiner le fond
		graphics2d.clearRect(0, 0, getWidth(), getHeight());
	
		// Transformation de la caméra
		AffineTransform old = graphics2d.getTransform();
		graphics2d.transform(transformation);
		
		// Dessiner la scène
		scene.draw(graphics2d);
		
		// Restaurer la scène
		graphics2d.setTransform(old);
		
		drawHud(graphics2d);
	}
	
	@Override
	public Dimension preferredSize() {
		return new Dimension(getWidth(), getHeight());
	}
	
	/**
	 * Ajouter une zone marqué comme à mettre à jour.
	 * @param region La région à mettre à jour.
	 */
	void addDirtyRegion(Rectangle2D region) {
		
		Rectangle2D dirt = region.transform(transformation).getBounds();
		
		repaint((int)dirt.getX(), (int)dirt.getY(), (int)dirt.getWidth() + 1, (int)dirt.getHeight() + 1);
	}
}
